#!/bin/bash

string_1='                  '
string_2='---------------------------'
green='\e[32m'
red='\e[31m'
defult='\e[39m'
blue='\e[34m'
end='\e[0m'

name_num=0
name_selected=()
select_num=0

usage="\n 使用方法：$blue 脚本名 名单\n$end\
        \\n 示例：./random_roll_call.sh ./name.text \n\
        \n 注意：（1）需指明名单文件所在路径以及文件名 （2）名单文件每个名字单独一行\n"

#判断脚本参数是否合法并规范化名单文件
init_check()
{
    if [ -z $1 ];then
        echo -e $usage
        exit
    else
        ls $1 &>/dev/null
        if [ $? -ne 0 ];then
            echo -e "$red \n 无法找到名单文件，请指定名单文件！\n$end"
            exit  
        fi
    fi

    sed -i '/^$/d' $1
    name_num=$(sed -n '$=' $1)

    if [[ $name_num -eq 0 ]];then
        echo -e "$red\n 名单文件为空！\n$end"
        exit
    else
        echo -e "$green\n 读取文件 $1 成功，识别到 $name_num 个名字！\n$end"
    fi
}

#读取用户输入的点名个数并判断合法性
read_select_num()
{
    while :
    do
        read -p "输入<点名数>进行点名，输入<q>退出：" select_num
        echo "$select_num"|[ -n "`sed -n '/^[0-9][0-9]*$/p'`" ] &>/dev/null
        is_number=$?
        #echo -e "\n++++$is_number\n"
        if [[ $select_num == 'q' ]];then
            echo -e "$green\n 再见，祝您生活愉快！ \n$end"
            exit
        elif [[ $is_number -eq 0 ]] ;then
            if [ $select_num -gt $name_num ];then
                echo -e "$red\n 点名个数 $select_num 大于文件内名字总数 $name_num ！\n$end"
                continue 
            else
                break
            fi
        else
            echo -e "$red \n 输入不正确！ \n$end"
            continue
        fi
    done
}

#根据用户输入的点名数初始化数组
init_name_slelected()
{
    name_selected=()
    for((i=0;i<$1;i++))
    do
        name_selected+=('--')
        #echo -e "++++ ${name_selected[$i]}"
    done
}

#参数1：需要生成几个名字
#参数2：名字存储文件
random_name()
{
    name_insert=0
    #插入到name_selected中的名字个数小于点名个数时进入循环
    while [ $name_insert -lt $1 ]
    do
        flag=0 #用于标记名字是否已存在
        #生成随机行数以选择随机名字
        line=$[RANDOM%$name_num+1]
        name=$(sed -n ""$line"p" $2)
        #echo -e "222$name"

        #遍历name_selected数组，若生成名字已存在flag置1并跳出
        for((i=0;i<$1;i++))
        do
            if [[ ${name_selected[$i]} == $name ]];then
                #echo -e "111"
                flag=1
                break
            fi
        done
        
        #flag为1时继续while循环重新生成随机名字
        if [ $flag -eq 1 ];then
            continue
        fi
        
        #将名字插入到数组中，计数器加1
        name_selected[$name_insert]=$name
        #echo -e "+++${name_selected[$name_insert]}"
        #echo -e "---$name_insert"
        name_insert=$[ $name_insert + 1 ]

    done
}

main()
{
    echo -e "\n$green$string_2 欢迎使用自动点名系统 $string_2$end\n"

    while :
    do
        init_check $1

        read_select_num

        init_name_slelected $select_num

        random_name $select_num $1

        echo -e "\n$green 点名开始：\n$end"

        for((i=0;i<$select_num;i++))
        do
            sleep 0.5
            name=${name_selected[$i]}
            echo -ne "$defult $name $end"
        done
        echo 
    done
}

main $1